(function(){

    /**
     * public:修饰的属性可以在任意地方被访问（修改），默认值
     * private: 修饰符的属性只能在类中被访问（修改），对象是不能访问（修改）的
     *      - 可以通过在类中添加方法，使得私有属性被外部访问
     * protected:只有当前类和当前类的子类能访问（修改），当前类的对象和当前类的子类对象是不能访问（修改）
     */
    class Person {
        name: string;
       private _age: number;
       protected gender: string;
        constructor(name:string,age:number,gender:string) {
            this.name = name;
            this._age = age;
            this.gender = gender;
        }

        /**
         * 属性的存取器：
         *   - getter:用于获取私有属性
         *   - setter:用于设置私有属性
         */
        getName() {
            return this.name
        }
        setName(name:string) {
            this.name = name;
        }

        /**
         * 采用该种方法，可以让我们直接像操作属性一样，不需要另外调用方法
         * get
         * set
         */

        get age() {
            return this._age
        }

        set age(age:number) {
            if (age >= 0) {
                this._age = age
            }
        }
    }

    const penson1 = new Person("张三",20,"男")
    console.log(penson1.getName()) // 张三

    penson1.age = 30
    console.log(penson1.age) // 30

    class Man extends Person {
       test() {
           console.log("protected：",this.gender)
       }
    }
    const boy = new Man("老李",40,"男")
    console.log(boy.test()) // 男
})()